home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / xobbs.arc / xocommon.c < prev    next >
C/C++ Source or Header  |  1989-05-03  |  6KB  |  299 lines

  1. /* XOCOMMON.C Commonly used routines for XOBBS and MAILDAEMON.*/
  2. /* Jim Durham, W2XO 10-24-88 */
  3. /* Version 1.0 */
  4. /* Code released to the amateur radio community */
  5.  
  6. #include "xobbs.h"
  7.  
  8. prinout(mode)
  9.     int mode;        /*modes - FLUSH/NOFLUSH */
  10. {
  11.     char *cp;
  12.     int i,j;
  13.     static char buf[1024];        /*and buffer*/
  14.     static int bufcnt = 0;
  15.     if(local){
  16.         cp=prinbuf;
  17.         while(*cp){
  18.         write(outfd,cp++,1);
  19.     }
  20.         alarm(180);
  21.     }
  22.     else{
  23.     alarm(500);
  24.         j=strlen(prinbuf);        /*get length of new output*/
  25.         for(i=0;i < j;i++){        /*convert lfs to crs*/
  26.             if(prinbuf[i] == '\n')
  27.                 prinbuf[i] = '\r';
  28.         }
  29.  
  30.     sprintf(buf + bufcnt,"%s",prinbuf);  /*copy prinbuf to output buffer*/
  31.     for(i=0; i < j; i++)        /*zero out prinbuf*/
  32.         prinbuf[i] = '\0';
  33.         /*if buffer full or mode is FLUSH*/
  34.     bufcnt = strlen(buf);
  35.     if((bufcnt + j) > 254)
  36.         mode = FLUSH;        /*force a buffer flush if full*/
  37.  
  38.     if(mode == FLUSH){        /*flush the buffer*/
  39.             sprintf(msg.mtext,"%s",buf); /*fill the message text area*/
  40.             msg.mtype = (long)pid;    /*source address (bbs pid)*/
  41.             if((msgsnd(smsgqid,&msg,bufcnt,0600)) < 0) /*send the output*/
  42.                 perror("prinout:");        /*barf if error*/
  43.         bufcnt = 0;            /*buffer flushed, zero count*/
  44.         }
  45.     }
  46. }
  47.  
  48. cprinout()
  49. {
  50.  
  51.  
  52.     int i,j;
  53.     
  54.     if(local){
  55.     perror("cprintout called from local\n");
  56.     return;
  57.     }
  58.     
  59.     j=strlen(prinbuf);
  60.     for(i=0;i < j;i++){
  61.         if(prinbuf[i] == '\n')      /*convert lfs to crs */
  62.             prinbuf[i] = '\r';
  63.     }
  64.     sprintf(msg.mtext,"%s",prinbuf); /*fill the message text area*/
  65.     msg.mtype = (long)pid;
  66.     if((msgsnd(scmsgqid,&msg,j,0600)) < 0)
  67.         perror("xocommon001");
  68.  
  69.     for(i=0; i < strlen(prinbuf); i++)
  70.         prinbuf[i] = '\0';
  71. }
  72.  
  73. sndupkil()
  74. {
  75.     
  76.     if(local){
  77.         sprintf(prinbuf,"\n");
  78.         prinout(FLUSH);
  79.         exit(0);
  80.     }
  81.     else{
  82.         sprintf(msg.mtext,"K\0");
  83.         msg.mtype = (long)pid;
  84.         if(msgsnd(scmsgqid,&msg,strlen(msg.mtext),0600) < 0)
  85.             perror("sndupkil:");    /*send kill*/
  86.         for(;;);        /*wait for kill*/
  87.     }
  88. }
  89.  
  90. gethighnum(flag)
  91.    int flag;
  92. {
  93.     int fd;
  94.     char temp[30];
  95.     
  96.     if((fd=open(paramfil,O_RDONLY)) < 0){
  97.         if(flag){
  98.         perror("maildaemon:paramfil:");
  99.             exit(1);
  100.         }
  101.         else{
  102.         sprintf(prinbuf,"bbs:Cant open %s\n",paramfil);
  103.         perror(prinbuf);
  104.             sndupkil();
  105.             for(;;);
  106.         }
  107.  
  108.     }
  109.     
  110.     read(fd,temp,6);
  111.     temp[6]='\0';
  112.     highnum=atoi(temp);
  113.     read(fd,temp,6);
  114.     temp[6]='\0';
  115.     msgcnt=atoi(temp);
  116. }
  117. getconfig()
  118. {
  119.     int fd;
  120.  
  121.  
  122.  
  123.     strcpy(homedir,HOMEDIR);
  124.     sprintf(prinbuf,"%sconfig.xo",homedir);
  125.     if((fd=open(prinbuf,O_RDONLY)) < 0){
  126.         perror("getconfig:Cant open config file");
  127.         exit(1);
  128.     }
  129.     fgetline(fd,inline);        /*forwarding file*/
  130.     rdfield(inline,fwddist);
  131.     fgetline(fd,inline);
  132.     rdfield(inline,fwddir);
  133.     fgetline(fd,inline);                /*get a line from the config file*/
  134.     rdfield(inline,maildir);            /*read the first field of file line*/
  135.     fgetline(fd,inline);                /*get next file line*/
  136.     rdfield(inline,filedir);            /*read first field to file path*/
  137.     fgetline(fd,inline);                /*..and so on */
  138.     rdfield(inline,tempdir);
  139.     fgetline(fd,inline);                /*..and so on */
  140.     rdfield(inline,usenetfil);        /* usenet file directory*/
  141.     fgetline(fd,inline);
  142.     rdfield(inline,paramfil);
  143.     fgetline(fd,inline);
  144.     rdfield(inline,fwdfile);
  145.     fgetline(fd,inline);
  146.     rdfield(inline,motdfil);
  147.     fgetline(fd,inline);
  148.     rdfield(inline,maildae);
  149.     fgetline(fd,inline);
  150.     rdfield(inline,userfil);   
  151.     fgetline(fd,inline);
  152.     rdfield(inline,hdrfile);   
  153.     fgetline(fd,inline);
  154.     rdfield(inline,logfile);
  155.     fgetline(fd,inline);
  156.     rdfield(inline,my.call);
  157.     fgetline(fd,inline);
  158.     rdfield(inline,my.name);
  159.     fgetline(fd,inline);
  160.     rdfield(inline,my.qth);
  161.     close(fd);
  162.     
  163. }
  164.  
  165. rdfield(s,t)
  166.     char *s,*t;
  167. {
  168.     
  169.     while((((*t = *s) != ' ') && (*s != '\t')) && ((*s != '\n') && (*s != '\0'))){
  170.         t++;
  171.         s++;
  172.     }
  173.     *t='\0';
  174. }
  175.  
  176.  
  177. fputline(fd,s)
  178.     int fd;
  179.     char *s;
  180. {
  181.     static char c = '\n';
  182.  
  183.     write(fd,s,strlen(s));
  184.     write(fd,&c,1);
  185. }
  186.  
  187. fgetline(fd,s)
  188.     int fd;
  189.     char *s;
  190. {
  191.     int i;
  192.     char c;
  193.     i=0;
  194.     while((c=xogetc(fd)) && ((c != '\n') && (c != '\r')))
  195.         s[i++] = c;
  196.  
  197.     s[i] = '\0';
  198.     return(i);
  199. }
  200.  
  201.  
  202. char xogetc(fd)
  203. {
  204.     char c;
  205.     if(read(fd,&c,1)){
  206.         c &= (char)0x7f;        /*strip 8th bit and up*/
  207.         if(c=='\r')
  208.             c='\n';
  209.         return(c);
  210.     }
  211.     else return('\0');
  212. }
  213.  
  214.  
  215. conhdr(hdr,mhdr)                            /*convert a header to header struct*/
  216.     char *hdr;
  217.     struct msghdr *mhdr;
  218. {
  219.     char temp[20];
  220.     
  221.     rdfield(hdr,temp);
  222.     mhdr->siz=atoi(temp);
  223.     mhdr->type=hdr[6];
  224.     mhdr->stat=hdr[7];
  225.     rdfield(&hdr[9],mhdr->tocall);
  226.     rdfield(&hdr[16],mhdr->fromcall);
  227.     rdfield(&hdr[23],mhdr->atbbs);
  228.     rdfield(&hdr[30],mhdr->dat);
  229.     rdfield(&hdr[37],mhdr->tim);
  230.     strncpy(mhdr->title,&hdr[42],30);
  231.     mhdr->title[30] = '\0';
  232.     rdfield(&hdr[73],mhdr->bid);
  233. }
  234.  
  235. matchn2(cp,lp,n)
  236.     char *cp;
  237.     char *lp;
  238.     int n;
  239. {
  240.     int i,except;
  241.     
  242.     if(n == 0)
  243.         return false;
  244.  
  245.     except=0;
  246.     if(*cp=='!')
  247.     {
  248.         except=1;
  249.         cp++;
  250.     }
  251.     if(*lp=='!')
  252.     {
  253.         except=1;
  254.         lp++;
  255.     }
  256.     
  257.  
  258.     for(i=0;i<n;i++)
  259.     {
  260.         if((*cp == *lp) || ((*cp=='?') || (*lp=='?')))
  261.             {
  262.                 cp++;
  263.                 lp++;
  264.             if((*cp=='\0') || (*lp == '\0'))
  265.                 if(except) return(false); else return(true);
  266.                 if((*cp=='*') || (*lp=='*'))    /*if the first char*/
  267.                     if(except) return(false); else return(true);        /*  is a star*/
  268.             }
  269.           else
  270.             if(except) return(true); else return(false);
  271.     }
  272.     if(except) return(false); else return(true);
  273. }
  274.  
  275. char *upcase(stng)            /*W2XO 8-11-87*/
  276.     char *stng;
  277. {
  278.     char *strpnt;
  279.     
  280.         strpnt=stng;
  281.     do
  282.         *strpnt = islower(*strpnt) ? toupper(*strpnt) : *strpnt;
  283.     while(*strpnt++);
  284.     return(stng);                /*return the original string*/
  285. }
  286.  
  287. char *lowcase(stng)            /*W2XO 8-11-87*/
  288.     char *stng;
  289. {
  290.     char *strpnt;
  291.     
  292.         strpnt=stng;
  293.     do
  294.         *strpnt = isupper(*strpnt) ? tolower(*strpnt) : *strpnt;
  295.     while(*strpnt++);
  296.     return(stng);                /*return the original string*/
  297. }
  298.  
  299.